home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / dbg / ds3100.md / dbgDis.c < prev    next >
C/C++ Source or Header  |  1992-12-18  |  5KB  |  224 lines

  1. /* dbgDis.c -
  2.  *
  3.  *         This contains the routine which disassembles an instruction to find
  4.  *    the target.
  5.  *
  6.  *    Copyright (C) 1989 Digital Equipment Corporation.
  7.  *    Permission to use, copy, modify, and distribute this software and
  8.  *    its documentation for any purpose and without fee is hereby granted,
  9.  *    provided that the above copyright notice appears in all copies.  
  10.  *    Digital Equipment Corporation makes no representations about the
  11.  *    suitability of this software for any purpose.  It is provided "as is"
  12.  *    without express or implied warranty.
  13.  */
  14.  
  15. #ifndef lint
  16. static char rcsid[] = "$Header: /cdrom/src/kernel/Cvsroot/kernel/dbg/ds3100.md/dbgDis.c,v 9.2 90/09/24 17:14:16 kupfer Exp $ SPRITE (Berkeley)";
  17. #endif not lint
  18.  
  19. #include <sprite.h>
  20. #include <mach.h>
  21. #include <dbgInt.h>
  22. #include <sys.h>
  23.  
  24. extern Mach_DebugState    mach_DebugState;
  25.  
  26. /*
  27.  * Define the three basic types of instruction formats.
  28.  */
  29. typedef struct {
  30.   unsigned imm: 16;
  31.   unsigned f2: 5;
  32.   unsigned f1: 5;
  33.   unsigned op: 6;
  34. } ITypeFmt;
  35.  
  36. typedef struct {
  37.   unsigned target: 26;
  38.   unsigned op: 6;
  39. } JTypeFmt;
  40.  
  41. typedef struct {
  42.   unsigned funct: 6;
  43.   unsigned f4: 5;
  44.   unsigned f3: 5;
  45.   unsigned f2: 5;
  46.   unsigned f1: 5;
  47.   unsigned op: 6;
  48. } RTypeFmt;
  49.  
  50. /*
  51.  * Opcodes of the branch instructions.
  52.  */
  53. #define OP_SPECIAL    0x00
  54. #define OP_BCOND    0x01
  55. #define OP_J        0x02
  56. #define    OP_JAL        0x03
  57. #define OP_BEQ        0x04
  58. #define OP_BNE        0x05
  59. #define OP_BLEZ        0x06
  60. #define OP_BGTZ        0x07
  61.  
  62. /*
  63.  * Branch subops of the special opcode.
  64.  */
  65. #define OP_JR        0x08
  66. #define OP_JALR        0x09
  67.  
  68. /*
  69.  * Sub-ops for OP_BCOND code.
  70.  */
  71. #define OP_BLTZ        0x00
  72. #define OP_BGEZ        0x01
  73. #define OP_BLTZAL    0x10
  74. #define OP_BGEZAL    0x11
  75.  
  76. /* 
  77.  * Forward references:
  78.  */
  79.  
  80. static unsigned int *GetBranchDest _ARGS_((ITypeFmt *iInstPtr));
  81.  
  82.  
  83. /*
  84.  * ----------------------------------------------------------------------------
  85.  *
  86.  * DbgGetDestPC --
  87.  *
  88.  *    Return the destination program counter of the instruction at the
  89.  *    given address.
  90.  *
  91.  * Results:
  92.  *    Destination PC of the given instruction.
  93.  *
  94.  * Side effects:
  95.  *    None.
  96.  *
  97.  * ----------------------------------------------------------------------------
  98.  */
  99. unsigned *
  100. DbgGetDestPC(instPC)
  101.     Address    instPC;
  102. {
  103.     JTypeFmt    *jInstPtr;
  104.     RTypeFmt    *rInstPtr;
  105.     ITypeFmt    *iInstPtr;
  106.     unsigned    *retAddr;
  107.     int        dummy;
  108.  
  109.     if (dbgTraceLevel >= 1) {
  110.     printf("Inst=%x\n", *(unsigned *)instPC);
  111.     }
  112.  
  113.     jInstPtr = (JTypeFmt *)instPC;
  114.     rInstPtr = (RTypeFmt *)instPC;
  115.     iInstPtr = (ITypeFmt *)instPC;
  116.  
  117.     dummy = jInstPtr->op;
  118.     switch (dummy) {
  119.         case OP_SPECIAL:
  120.         dummy = rInstPtr->funct;
  121.         switch (dummy) {
  122.         case OP_JR:
  123.         case OP_JALR:
  124.             retAddr = (unsigned *)mach_DebugState.regs[rInstPtr->f1];
  125.             break;
  126.         default:
  127.             retAddr = (unsigned *)(instPC + 4);
  128.             break;
  129.         }
  130.         break;
  131.         case OP_BCOND:
  132.         dummy = iInstPtr->f2;
  133.         switch (dummy) {
  134.         case OP_BLTZ:
  135.         case OP_BLTZAL:
  136.             if ((int)(mach_DebugState.regs[rInstPtr->f1]) < 0) { 
  137.             retAddr = GetBranchDest(iInstPtr);
  138.             } else {
  139.             retAddr = (unsigned *) (instPC + 8);
  140.             }
  141.             break;
  142.         case OP_BGEZAL:
  143.         case OP_BGEZ:
  144.             if ((int)(mach_DebugState.regs[rInstPtr->f1]) >= 0) { 
  145.             retAddr = GetBranchDest(iInstPtr);
  146.             } else {
  147.             retAddr = (unsigned *) (instPC + 8);
  148.             }
  149.             break;
  150.         default:
  151.             printf("DbgGetDestPC: Bad branch cond\n");
  152.             retAddr = (unsigned *)(instPC + 4);
  153.             break;
  154.         }
  155.         break;
  156.         case OP_J:
  157.         case OP_JAL:
  158.         retAddr = (unsigned *) ((jInstPtr->target << 2) | 
  159.                    ((unsigned)instPC & 0xF0000000));
  160.         break;
  161.         break;
  162.         case OP_BEQ:
  163.         if (mach_DebugState.regs[rInstPtr->f1] == 
  164.             mach_DebugState.regs[rInstPtr->f2]) {
  165.         retAddr = GetBranchDest(iInstPtr);
  166.         } else {
  167.         retAddr = (unsigned *) (instPC + 8);
  168.         }
  169.         break;
  170.         case OP_BNE:
  171.         if (mach_DebugState.regs[rInstPtr->f1] != 
  172.             mach_DebugState.regs[rInstPtr->f2]) {
  173.         retAddr = GetBranchDest(iInstPtr);
  174.         } else {
  175.         retAddr = (unsigned *) (instPC + 8);
  176.         }
  177.         break;
  178.         case OP_BLEZ:
  179.         if ((int)(mach_DebugState.regs[rInstPtr->f1]) <= 0) { 
  180.         retAddr = GetBranchDest(iInstPtr);
  181.         } else {
  182.         retAddr = (unsigned *) (instPC + 8);
  183.         }
  184.         break;
  185.         case OP_BGTZ:
  186.         if ((int)(mach_DebugState.regs[rInstPtr->f1]) > 0) { 
  187.         retAddr = GetBranchDest(iInstPtr);
  188.         } else {
  189.         retAddr = (unsigned *) (instPC + 8);
  190.         }
  191.         break;
  192.     default:
  193.         retAddr = (unsigned *)(instPC + 4);
  194.         break;
  195.     }
  196.     if (dbgTraceLevel >= 1) {
  197.     printf("Target addr=%x\n", retAddr);
  198.     }
  199.     return(retAddr);
  200. }
  201.  
  202.  
  203. /*
  204.  * ----------------------------------------------------------------------------
  205.  *
  206.  * GetBranchDest --
  207.  *
  208.  *    Return the destination of the given branch instruction.
  209.  *
  210.  * Results:
  211.  *    The destination of the given branch instruction.
  212.  *
  213.  * Side effects:
  214.  *    None.
  215.  *
  216.  * ----------------------------------------------------------------------------
  217.  */
  218. static unsigned *
  219. GetBranchDest(iInstPtr)
  220.     ITypeFmt    *iInstPtr;
  221. {
  222.     return((unsigned *)((Address)iInstPtr + 4 + ((short)iInstPtr->imm << 2)));
  223. }
  224.